package cn.lg.soar.system.biz.filetemplate.model;

import java.io.*;
import java.nio.file.Path;

/**
 * 支持 Range 范围读取的 InputStream 实现
 */
public class RangedInputStream extends InputStream {
    private final InputStream delegate; // 原始输入流
    private final long start;           // 起始偏移量
    private final long end;             // 结束偏移量
    private long position = 0;          // 当前读取位置

    /**
     * 构造方法：创建一个从 start 到 end 的分段输入流
     */
    public RangedInputStream(Path path, long start, long end) throws FileNotFoundException {
        this.delegate = new BufferedInputStream(new FileInputStream(path.toFile()));
        this.start = start;
        this.end = end;

        // 跳过前面不需要的部分
        try {
            while (position < start) {
                long skipped = delegate.skip(start - position);
                if (skipped <= 0) break; // 防止死循环
                position += skipped;
            }
        } catch (IOException ignored) {
            // 可选：记录日志
        }
    }

    /**
     * 重写 read() 方法：只读取 start ~ end 范围内的内容
     */
    @Override
    public int read() throws IOException {
        if (position > end) {
            return -1; // 已经读完指定范围
        }

        int b = delegate.read();
        if (b >= 0) {
            position++; // 成功读取一个字节
        }
        return b;
    }

    /**
     * 关闭流资源
     */
    @Override
    public void close() throws IOException {
        delegate.close();
    }
}